package com.study.designmodes.service.liabilityChain.v4;

/**
 * 4、抽象处理器插槽
 *
 * @author yangyanbin
 * @date 2023/03/22
 * @since 20230322
 */
public abstract class AbstractLinkedProcessorSlot<T> implements ProcessorSlot<T> {

    /**
     * 定义下个对象的引用
     */
    public AbstractLinkedProcessorSlot<T> next = null;


    /**
     * 执行方法
     *
     * @param context
     */
    @Override
    public void process(T context) {
        // 校验
        validate(context);

        // 处理
        doProcess(context);

        // 退出
        exit(context);

    }

    /**
     * 退出执行方法
     *
     * @param context
     */
    @Override
    public void exit(T context) {
        if (next != null) {
            // 循环调用
            next.process(context);
        }

    }

    /**
     * 处理过程
     *
     * @param context 上下文
     */
    protected abstract void doProcess(T context);


    /**
     * 验证
     *
     * @param context 上下文
     */
    protected abstract void validate(T context);


    public AbstractLinkedProcessorSlot<T> getNext() {
        return next;
    }

    public void setNext(AbstractLinkedProcessorSlot<T> next) {
        this.next = next;
    }
}
